package testJdk.lambda;

import com.google.common.collect.Lists;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @author keyer
 * @Description : 描述
 * Created by cyd on 2021-04-01 13:49:57
 */
public class LearnLambda02 {

    /**
     * 定义一个消费方法
     * 传入一个参数做业务处理，没有返回值
     *
     * @param money 钱
     * @param com   函数式接口
     */
    public void happy(double money, Consumer<Double> com) {
        // 调用抽象方法
        com.accept(money);
    }

    /**
     * lambda表达式覆写接口的抽象方法
     */
    @Test
    public void testHappy() {
        happy(50, (m) -> {
            System.out.println("花了" + m + "元");
        });
    }

    /**
     * 供给型接口
     *
     * @param num 参数，注意不是lambda的参数，是方法的参数
     * @param sp  函数
     * @return 结果
     */
    public List<Integer> getNumList(int num, Supplier<Integer> sp) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            arrayList.add(sp.get());
        }
        return arrayList;
    }

    @Test
    public void test2() {
        List<Integer> numList = getNumList(5, () -> ((int) (Math.random() * 100)));
        numList.forEach(System.out::println);
    }

    /**
     * 函数型接口
     *
     * @param str lambda参数
     * @param fun 函数型接口
     * @return lambda的返回值
     */
    public String strHandle(String str, Function<String, String> fun) {
        return fun.apply(str);
    }

    @Test
    public void test3() {
        String str = strHandle("张无忌", (x) -> (x + "是武林盟主"));
        System.out.println(str);
    }

    /**
     * 断言型接口
     *
     * @param list     被判断的参数
     * @param myFilter 判断的逻辑
     * @return 结果
     */
    public List<Integer> filter(List<Integer> list, Predicate<Integer> myFilter) {
        List<Integer> newList = new ArrayList<>();
        for (Integer s : list) {
            // 判断的逻辑,返回布尔值
            if (myFilter.test(s)) {
                newList.add(s);
            }
        }
        return newList;
    }

    @Test
    public void testFilter() {
        List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        List<Integer> newList = filter(list, (x) -> {
            return x > 8;
        });
        System.out.println(newList);
    }


}
